From: akw27@arcadians.cl.cam.ac.uk Date: Wed, 9 Mar 2005 10:59:11 +0000 (+0000) Subject: bitkeeper revision 1.1236.15.1 (422ed6ffKvpALk9Jv4dfEbnMfU7rPQ) X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~17857^2~57^2~6^2 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=e25ccd85491fb02958bc50c7a95dd5bb77a4d6ca;p=xen.git bitkeeper revision 1.1236.15.1 (422ed6ffKvpALk9Jv4dfEbnMfU7rPQ) Unmap foreign pages properly. Signed-off-by: andrew.warfield@cl.cam.ac.uk --- diff --git a/linux-2.6.10-xen-sparse/drivers/xen/blktap/blktap_datapath.c b/linux-2.6.10-xen-sparse/drivers/xen/blktap/blktap_datapath.c index dc2c0a7390..88360e5ab4 100644 --- a/linux-2.6.10-xen-sparse/drivers/xen/blktap/blktap_datapath.c +++ b/linux-2.6.10-xen-sparse/drivers/xen/blktap/blktap_datapath.c @@ -315,6 +315,7 @@ static int do_block_io_op(blkif_t *blkif, int max_to_do) */ ar = get_active_req(); ar->id = req_s->id; + ar->nr_pages = req_s->nr_segments; blkif_get(blkif); ar->blkif = blkif; req_s->id = MAKE_ID(blkif->domid, ACTIVE_IDX(ar)); diff --git a/linux-2.6.10-xen-sparse/drivers/xen/blktap/blktap_userdev.c b/linux-2.6.10-xen-sparse/drivers/xen/blktap/blktap_userdev.c index 9e94f800bf..3cc307fddf 100644 --- a/linux-2.6.10-xen-sparse/drivers/xen/blktap/blktap_userdev.c +++ b/linux-2.6.10-xen-sparse/drivers/xen/blktap/blktap_userdev.c @@ -355,6 +355,24 @@ int blktap_write_be_ring(blkif_response_t *rsp) return 0; } +static void blktap_fast_flush_area(int idx, int nr_pages) +{ + multicall_entry_t mcl[MMAP_PAGES_PER_REQUEST]; + int i; + + for ( i = 0; i < nr_pages; i++ ) + { + mcl[i].op = __HYPERVISOR_update_va_mapping; + mcl[i].args[0] = MMAP_VADDR(idx, i); + mcl[i].args[1] = 0; + mcl[i].args[2] = 0; + } + + mcl[nr_pages-1].args[2] = UVMF_FLUSH_TLB; + if ( unlikely(HYPERVISOR_multicall(mcl, nr_pages) != 0) ) + BUG(); +} + static int blktap_read_fe_ring(void) { /* This is called to read responses from the UFE ring. */ @@ -380,6 +398,7 @@ static int blktap_read_fe_ring(void) DPRINTK("resp->fe_ring\n"); ar = lookup_active_req(ID_TO_IDX(resp_s->id)); blkif = ar->blkif; + blktap_fast_flush_area(ID_TO_IDX(resp_s->id), ar->nr_pages); write_resp_to_fe_ring(blkif, resp_s); kick_fe_domain(blkif); }